package com.edu.exam.entity.exampaper.management;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 试卷版本实体类
 * 所属模块：B-03 试卷管理模块
 * 对应数据库表：paper_version
 *
 * <p>试卷版本实体用于管理试卷的版本信息和控制，支持版本创建、状态管理、
 * 版本历史跟踪等功能。采用无回滚设计，仅提供只读的版本管理功能。</p>
 *
 * <p>核心功能：
 * - 版本管理：管理试卷的版本号和状态
 * - 版本控制：支持线性版本控制，无回滚功能
 * - 历史跟踪：记录版本创建信息、变更说明等
 * - 状态管理：支持活跃、被替代、归档等状态
 * - 版本比较：支持版本间的信息比较和差异跟踪</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class PaperVersion {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 关联试卷ID
     *
     * <p>关联的试卷ID，对应exam_paper表的主键。
     * 用于建立试卷与版本的关联关系。</p>
     */
    @Column(name = "paper_id", nullable = false)
    private Long paperId;

    /**
     * 版本号
     *
     * <p>试卷的版本号，采用主版本.修订版本格式。
     * 例如：1.0（初始版本）、1.1（小幅修订）、2.0（重大更新）。</p>
     */
    @Column(name = "version", nullable = false, length = 20)
    private String version;

    /**
     * 关联内容ID
     *
     * <p>关联的内容ID，对应paper_content表的主键。
     * 指向该版本对应的试卷内容。</p>
     */
    @Column(name = "content_id", nullable = false)
    private Long contentId;

    /**
     * 版本状态
     *
     * <p>版本的状态标识。
     * 支持的状态包括：ACTIVE（活跃）、SUPERSEDED（被替代）、ARCHIVED（已归档）。</p>
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status = "ACTIVE";

    /**
     * 创建时间
     *
     * <p>版本的创建时间。
     * 用于版本排序和时间跟踪。</p>
     */
    @Column(name = "create_time", nullable = false)
    private LocalDateTime createTime;

    /**
     * 创建人
     *
     * <p>版本的创建人员。
     * 记录是谁创建了这个版本。</p>
     */
    @Column(name = "created_by", nullable = false, length = 50)
    private String createdBy;

    /**
     * 变更说明
     *
     * <p>本次版本变更的详细说明。
     * 描述为什么要创建这个版本，主要变更内容等。</p>
     */
    @Column(name = "change_note", length = 200)
    private String changeNote;

    /**
     * 是否为当前版本
     *
     * <p>标识是否为试卷的当前有效版本。
     * true表示当前版本，false表示历史版本。</p>
     */
    @Column(name = "is_current", nullable = false)
    private Boolean isCurrent = false;

    /**
     * 主版本号
     *
     * <p>版本号中的主版本部分。
     * 例如：版本号"1.2"的主版本号为"1"。</p>
     */
    @Column(name = "major_version")
    private Integer majorVersion;

    /**
     * 修订版本号
     *
     * <p>版本号中的修订版本部分。
     * 例如：版本号"1.2"的修订版本号为"2"。</p>
     */
    @Column(name = "minor_version")
    private Integer minorVersion;

    /**
     * 版本标签
     *
     * <p>版本的标签说明。
     * 例如："初始版本"、"重大更新"、"bug修复"等。</p>
     */
    @Column(name = "version_label", length = 100)
    private String versionLabel;

    /**
     * 版本描述
     *
     * <p>版本的详细描述信息。
     * 包含版本的主要特性、变更内容等。</p>
     */
    @Column(name = "version_description", columnDefinition = "TEXT")
    private String versionDescription;

    /**
     * 变更类型
     *
     * <p>版本变更的类型。
     * 支持的类型包括：MAJOR（重大变更）、MINOR（小幅变更）、PATCH（补丁修复）。</p>
     */
    @Column(name = "change_type", length = 20)
    private String changeType;

    /**
     * 前一版本ID
     *
     * <p>前一版本的ID。
     * 用于构建版本链和变更跟踪。</p>
     */
    @Column(name = "previous_version_id")
    private Long previousVersionId;

    /**
     * 变更统计
     *
     * <p>本次变更的统计信息（JSON格式）。
     * 包含变更的题目数量、内容变更等信息。</p>
     */
    @Column(name = "change_statistics", columnDefinition = "TEXT")
    private String changeStatistics;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间（审计）
     */
    @CreatedDate
    @Column(name = "created_time_audit", nullable = false, updatable = false)
    private LocalDateTime createdTimeAudit;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 标准审计字段 =====

    /**
     * 创建时间（标准审计字段）
     */
    @CreationTimestamp
    @Column(name = "created_time_audit_2", nullable = false, updatable = false)
    private LocalDateTime createdTimeAudit2;

    /**
     * 更新时间（标准审计字段）
     */
    @UpdateTimestamp
    @Column(name = "updated_time_audit", nullable = false)
    private LocalDateTime updatedTimeAudit;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version_audit")
    Long versionAudit = 0L;

    /**
     * 逻辑删除标记（标准审计字段）
     */
    @Column(name = "is_deleted_audit", nullable = false)
    Boolean isDeletedAudit = false;

    // ===== 常量定义 =====

    // 版本状态常量
    /** 版本状态 - 活跃 */
    public static final String STATUS_ACTIVE = "ACTIVE";

    /** 版本状态 - 被替代 */
    public static final String STATUS_SUPERSEDED = "SUPERSEDED";

    /** 版本状态 - 已归档 */
    public static final String STATUS_ARCHIVED = "ARCHIVED";

    // 变更类型常量
    /** 变更类型 - 重大变更 */
    public static final String CHANGE_TYPE_MAJOR = "MAJOR";

    /** 变更类型 - 小幅变更 */
    public static final String CHANGE_TYPE_MINOR = "MINOR";

    /** 变更类型 - 补丁修复 */
    public static final String CHANGE_TYPE_PATCH = "PATCH";
}